#include <algorithm>
#include "MedianFilter.h"

#include <iostream> /* DEBUG; */

void
MedianFilter::help(std::string &buf) const
{
    buf.append("中值滤波器,适合处理脉冲噪声,包括单级,双级脉冲噪声\n");
    Filter::help(buf);
    return ;
}

double
MedianFilter::operOnNeigh(const cv::Mat &neigh)
{
    cv::Mat n = neigh.clone();
    /*
     * 算法导论上有一个时间复杂度为 O(N) 的提取第 k 大的算法.
     * 而现在我们是先排序然后返回中间值,时间复杂度为 O(nlgn).
     */
    std::sort(n.begin<uchar>(),n.end<uchar>());
    return *(n.begin<uchar>() + (n.rows * n.cols - 1) / 2);
}

NOISE_ALGO_REGISTER("MedianFilter",MedianFilter);


